//============================================================================
// Name        : ver_historial.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include "libreria.h"
using namespace std;
//ficheros:

FILE *historial;
FILE *indice_historial;
FILE *codigos;

//funciones:
void abrir_ficheros();
void cargar_datos();
void leer_datos(long int &);
void buscar_en_historial(long int);
void cerrar_ficheros();

//definiciones:
typedef struct{
	int posicion;
	char fecha_hora[14];
}tipo_fecha_posicion;

typedef struct {
	long int cod_paciente;
	char tratamiento[100];
}tipo_cita_historial;

typedef multimap<long int, tipo_fecha_posicion, less<long int> > tipo_mapa_historial;
typedef map<long int, bool, less<long int> > tipo_mapa_pacientes;

//variables globales:
tipo_mapa_historial indice_pacientes;
tipo_mapa_pacientes mapa_pacientes;


//comienzo del main:
int main() {
	long int codigo;
	abrir_ficheros();
	if (historial==NULL)
	{
		cout<<"No existe historial."<<endl;
		system("pause");
		return 0;
	}
	cargar_datos();
	leer_datos(codigo);
	buscar_en_historial(codigo);
	cerrar_ficheros();
	system("pause");
	return 0;
}

void abrir_ficheros()
{
	indice_historial=fopen("..\\..\\datos\\indice_historial.dat","r");

	historial=fopen("..\\..\\datos\\historial.dat","r+b");

	if ((codigos=fopen("..\\..\\datos\\codigos.dat","r"))==NULL)
		printf("El fichero codigos no se puede abrir\n");
}

void cargar_datos()
{
	long int cod_pac;
	tipo_fecha_posicion fecha_posicion;
	if(indice_historial!=NULL)
	{
		while(!feof(indice_historial))
		{
			fscanf(indice_historial,"%s >>> %d <<< %ld\n",fecha_posicion.fecha_hora,&fecha_posicion.posicion,&cod_pac);
			indice_pacientes.insert(pair<long int,tipo_fecha_posicion>(cod_pac,fecha_posicion));

		}
	}
	while(!feof(codigos))
	{
		fscanf(codigos,"%ld\n",&cod_pac);
		mapa_pacientes.insert(pair<long int,bool>(cod_pac,false));
	}

}

void leer_datos(long int &id)
{
	//la variable id es global y contiene
	bool encontrado;
	do{
		do {
			cout<<"Introduce el codigo numerico del paciente:"<<endl;
			id=leer_entero();
		}while(id<=99999 || id > 999999);
		encontrado=false;
		if (mapa_pacientes.find(id)!=mapa_pacientes.end())
			encontrado=true;
	}while(encontrado==false);


}

void buscar_en_historial(long int id)
{
	int i=1,posicion;
	tipo_mapa_historial::iterator low,up,itr;
	tipo_cita_historial dato;
	low=indice_pacientes.lower_bound(id);
	up=indice_pacientes.upper_bound(id);
	if(indice_pacientes.find(id)==indice_pacientes.end())
	{
		cout<<"El paciente "<<id<<" no tiene citas en el historial."<<endl;
	}
	else
	{
		cout<<"El paciente "<<id<<" tiene las siguientes citas en el historial: "<<endl;

		for(itr=low;itr!=up;itr++)
		{
			cout<<i<<"). "<<(*itr).second.fecha_hora<<endl;
			i++;
			posicion=(*itr).second.posicion;
			fseek(historial,(posicion-1)*sizeof(tipo_cita_historial),0);
			fread(&dato,sizeof(tipo_cita_historial),1,historial);
			cout<<"\t"<<"Tratamiento:"<<dato.tratamiento<<endl<<endl;
		}
	}
}

void cerrar_ficheros()
{
	fclose(historial);
	fclose(indice_historial);
	fclose(codigos);
}
